package com.competition.web.admin.queue;

import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

import org.springframework.stereotype.Component;




/**
 * 消息队列管理
 * 
 * @author 111
 */
@Component
public class SysMsgQueue<T> {

	/**
	 * 存放系统消息, 采用无界队列LinkedBlockingQueue：是一个由链表结构组成的双向阻塞队列，即可以从队列的两端插入和移除元素
	 */
	private BlockingQueue<T> bizMsgQueue = new LinkedBlockingDeque<>(MsgQueueConstant.MAX_QUEUE);

	/**
	 * 批量添加队列消息
	 * 
	 * @param bizMsgs
	 */
	public void addAll(List<T> bizMsgs) {
		bizMsgQueue.addAll(bizMsgs);
	}

	/**
	 * 批量添加队列消息
	 * 
	 * @param bizMsgs
	 */
	public void add(T bizMsgs) {
		bizMsgQueue.add(bizMsgs);
	}

	/**
	 * 移除并返回列头部元素，如队列为空阻塞
	 * 
	 * @return
	 * @throws InterruptedException
	 */
	public T take() throws InterruptedException {
		return bizMsgQueue.take();
	}

	/**
	 * //获取并移除此队列的头，如果此队列为空，则返回 null。
	 * 
	 * @return
	 */
	public T poll() {
		return bizMsgQueue.poll();
	}

	/**
	 * 返回当前队列成员数量
	 * 
	 * @return
	 */
	public Integer count() {
		return bizMsgQueue.size();
	}
}
